﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DBSystem.BussinesEntities;

namespace DBSystem.Repository
{
    public class UsuarioRepository:MasterRepository,IUsuarioRepository
    {
        public List<Usuario> GetFromUsuario()
        {
            return Context.Usuarios.ToList();
        }

        public Usuario GetFromUsuarioById(int id)
        {
            var usuario = (from u in Context.Usuarios.Include("Preferencias")
                           where u.Id.Equals(id)
                           select u).SingleOrDefault();

            var preferencias = Context.Preferencias.ToList();

            foreach (var item in preferencias)
            {
                if (usuario.Preferencias.Contains(item))
                    item.IsSelect = true;
            }

            usuario.Preferencias = preferencias;

            return usuario;
        }

        public void AddUsuario(Usuario usuario)
        {
            var newUser = new Usuario() { Nombres = usuario.Nombres };

            foreach (var item in usuario.Preferencias)
            {
                if (item.IsSelect)
                {
                    Context.Entry(item).State = EntityState.Unchanged;
                    newUser.Preferencias.Add(item);
                }
            }

            Context.Usuarios.Add(newUser);
            Context.SaveChanges();

        }

        public void UpdateUsuario(Usuario usuario)
        {
            var usuarioDB = (from u in Context.Usuarios.Include("Preferencias")
                           where u.Id.Equals(usuario.Id)
                           select u).SingleOrDefault();

            var preferenciasSelect = usuario.Preferencias.Where(p => p.IsSelect == true);
            var preferenciasNoSelect = usuario.Preferencias.Where(p => p.IsSelect == false);

            //busco nuevos elementos
            foreach (var item in preferenciasSelect)
            {
                var existe = usuarioDB.Preferencias.SingleOrDefault(p => p.Id.Equals(item.Id));
                if (existe == null)
                {
                    Context.Entry(item).State = EntityState.Unchanged;
                    usuarioDB.Preferencias.Add(item);
                }
            }

            //busco elementos eliminos
            foreach (var item in preferenciasNoSelect)
            {
                var existe = usuarioDB.Preferencias.SingleOrDefault(p => p.Id.Equals(item.Id));

                if (existe != null)
                {
                    usuarioDB.Preferencias.Remove(existe);
                }
            }

            usuarioDB.Nombres = usuario.Nombres;

            //guardo los cambios
            Context.SaveChanges();

        }

        public void RemoveUsuario(int id)
        {
           var existe =  (from u in Context.Usuarios.Include("Preferencias")
             where u.Id.Equals(id)
             select u).SingleOrDefault();

            if (existe!=null)
            {
                Context.Entry(existe).State = EntityState.Deleted;
                Context.SaveChanges();
            }

        }
    }
}
